package networkTraining;

import java.util.List;
import java.util.Map;

import networkTraining.algorithms.ITrainingAlgorithm;
import networkTraining.convergence.IConvergenceTest;
import networkTraining.epoch.IEpochExecutor;
import networkTraining.inspection.IPostFinalizeInspector;
import networkTraining.inspection.IPostTestingEpochInspector;
import networkTraining.inspection.IPostTrainingEpochInspector;
import networkTraining.inspection.IPreInitializeInspector;
import networkTraining.inspection.IPreTestingEpochInspector;
import networkTraining.inspection.IPreTrainingEpochInspector;
import networkTraining.inspection.ITrainingInspector;
import neuralNetwork.INeuralNetwork;

public interface INetworkTrainer
{
	public INeuralNetwork getNeuralNetwork();

	public void setNeuralNetwork(INeuralNetwork neuralNetwork);

	public IDataSetProvider getDataSetProvider();

	public void setDataSetProvider(IDataSetProvider dataSetProvider);

	public int getMaxEpochCount();

	public void setMaxEpochCount(int maxEpochCount);

	public IEpochExecutor geteEpochExecutor();

	public void setEpochExecutor(IEpochExecutor epochExecutor);

	public ITrainingAlgorithm getTrainingAlgorithm();

	public void setTrainingAlgorithm(ITrainingAlgorithm trainingAlgorithm);

	public void applyTrainingAlgorithm(Map<String, Double> errorMap);
	
	public IConvergenceTest getConvergenceTest();

	public void setConvergenceTest(IConvergenceTest convergenceTest);

	public void addTrainingInspector(ITrainingInspector trainingInspector);

	public List<IPreInitializeInspector> getPreTrainingInspectors();

	public List<IPostFinalizeInspector> getPostTrainingInspectors();

	public List<IPreTrainingEpochInspector> getPreTrainingEpochInspectors();

	public List<IPostTrainingEpochInspector> getPostTrainingEpochInspectors();

	public List<IPreTestingEpochInspector> getPreTestingEpochInspectors();

	public List<IPostTestingEpochInspector> getPostTestingEpochInspectors();

	
	public void trainNetwork();

}
